--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
Commit dee8de83ce36639b8b3f8f4661c43c86d1d8bbca
Parents : 9f5a64e
Author : Ivan <ivan@quad4.io>
Signature : Invalid signer <e46112d44649266d71fe2193e00a4710>, author is <ivan@quad4.io>
Date : 2026-07-06T22:04:02-05:00
chore(release): bump version to 4.8.0
Changes
20 files changed, 56 insertions(+), 26 deletions(-)
Diff
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 4b6aecb6..60617a99 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -2,6 +2,18 @@
All notable changes to this project will be documented in this file.
+## [4.8.0] - 2026-07-TBD
+
+### Fixed
+
+- **RNode / Android**: Hardened `rnode_support` startup guards — desktop TCP RNode no longer incorrectly requires pyserial; desktop BLE now checks for bleak instead of pyserial; whitespace-only Bluetooth ports classify correctly; invalid `tcp:///` hosts are no longer backfilled; `RNodeIPInterface` entries get `tcp_host` backfill on Android; RNodeMulti sibling sub-interfaces with invalid TX power are detected and disabled; txpower guard honors both `enabled` and `interface_enabled` keys.
+- **Settings**: Tabbed settings navigation with section-to-tab mapping, search across tabs, and `SettingsNav` component.
+
+### Added
+
+- **Tests**: Expanded `rnode_support` coverage (67 tests, including hypothesis fuzzing and full startup repair sequence); settings tabs contract tests, i18n key validation, and `SettingsNav` component tests.
+- **Locales**: Finnish (`fi`) translation updates for settings tabs, archives, banishment, and common UI strings.
+
## [4.7.2] - 2026-07-06
### Fixed
diff --git a/README.md b/README.md
index f6eea4eb..f0cf039f 100644
--- a/README.md
+++ b/README.md
@@ -431,7 +431,7 @@ task build
## Versioning
-Current version in this repo is `4.7.2`.
+Current version in this repo is `4.8.0`.
- **`package.json`** `version` is the only value you edit for a release bump.
- Run **`pnpm run version:sync`** (also run at the start of **`pnpm run build`**) to propagate that version into **`pyproject.toml`**, **`meshchatx/src/version.py`**, **`THIRD_PARTY_NOTICES.txt`** (product line), **README** / **lang/README.\*** “current version” lines, **`docs/meshchatx_on_raspberry_pi.md`** pipx example, and **`packaging/arch/PKGBUILD`** helpers.
diff --git a/android/app/build.gradle b/android/app/build.gradle
index 354c37ea..d20bcbbc 100644
--- a/android/app/build.gradle
+++ b/android/app/build.gradle
@@ -48,8 +48,8 @@ android {
applicationId "com.meshchatx"
minSdk 24
targetSdk 35
- versionCode 47002
- versionName "4.7.2"
+ versionCode 48000
+ versionName "4.8.0"
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
ndk {
diff --git a/docs/meshchatx_on_raspberry_pi.md b/docs/meshchatx_on_raspberry_pi.md
index 9ad02b1d..bd118a4c 100644
--- a/docs/meshchatx_on_raspberry_pi.md
+++ b/docs/meshchatx_on_raspberry_pi.md
@@ -61,17 +61,17 @@ source ~/.profile
## 3) Install MeshChatX with pipx (recommended)
-Preferred option (recommended): install from a release wheel (4.7.2 or newer),
+Preferred option (recommended): install from a release wheel (4.8.0 or newer),
because the wheel bundles frontend assets.
```bash
pipx install /path/to/reticulum_meshchatx-<version>-py3-none-any.whl
```
-Direct example (v4.7.2):
+Direct example (v4.8.0):
```bash
-pipx install "https://github.com/Quad4-Software/MeshChatX/releases/download/v4.7.2/reticulum_meshchatx-4.7.2-py3-none-any.whl"
+pipx install "https://github.com/Quad4-Software/MeshChatX/releases/download/v4.8.0/reticulum_meshchatx-4.8.0-py3-none-any.whl"
```
`py3-none-any` wheels are architecture-independent, so the same wheel artifact
@@ -93,7 +93,7 @@ cd ~/meshchatx
python3 -m venv .venv
source .venv/bin/activate
python -m pip install --upgrade pip
-python -m pip install "https://github.com/Quad4-Software/MeshChatX/releases/download/v4.7.2/reticulum_meshchatx-4.7.2-py3-none-any.whl"
+python -m pip install "https://github.com/Quad4-Software/MeshChatX/releases/download/v4.8.0/reticulum_meshchatx-4.8.0-py3-none-any.whl"
```
Run command in venv mode:
diff --git a/lang/README.de.md b/lang/README.de.md
index 3a8d3cea..86d55175 100644
--- a/lang/README.de.md
+++ b/lang/README.de.md
@@ -348,7 +348,7 @@ task build
## Versionierung
-Aktuelle Version in diesem Repository: `4.7.2`.
+Aktuelle Version in diesem Repository: `4.8.0`.
- Fuer Release-Bumps bearbeiten Sie **nur** `version` in **`package.json`**.
- **`pnpm run version:sync`** (wird auch zu Beginn von **`pnpm run build`** ausgefuehrt) verbreitet diese Version in **`pyproject.toml`**, **`meshchatx/src/version.py`**, **`THIRD_PARTY_NOTICES.txt`** (Produktzeile), **README** / **lang/README.\*** (Zeilen mit aktueller Version), **`docs/meshchatx_on_raspberry_pi.md`** (pipx-Beispiel) und Hilfsfelder in **`packaging/arch/PKGBUILD`**.
diff --git a/lang/README.it.md b/lang/README.it.md
index d498de7a..55612d69 100644
--- a/lang/README.it.md
+++ b/lang/README.it.md
@@ -348,7 +348,7 @@ I target `Makefile` sono wrapper sottili che delegano a `task` (stessi comandi d
## Versionamento
-Versione attuale nel repository: `4.7.2`.
+Versione attuale nel repository: `4.8.0`.
- L'unico valore che modifichi per un bump di release e **`version` in `package.json`**.
- Esegui **`pnpm run version:sync`** (all'inizio anche di **`pnpm run build`**) per propagare in **`pyproject.toml`**, **`meshchatx/src/version.py`**, **`THIRD_PARTY_NOTICES.txt`** (riga prodotto), **README** / **lang/README.\*** (righe "versione attuale"), **esempio pipx in `docs/meshchatx_on_raspberry_pi.md`**, e aiuti in **`packaging/arch/PKGBUILD`**.
diff --git a/lang/README.ja.md b/lang/README.ja.md
index c3601f3a..e209f7ae 100644
--- a/lang/README.ja.md
+++ b/lang/README.ja.md
@@ -348,7 +348,7 @@ task build
## バージョン管理
-このリポジトリの現在のバージョンは `4.7.2` です。
+このリポジトリの現在のバージョンは `4.8.0` です。
- リリースのバージョン上げは **`package.json` の `version` のみ**編集します。
- **`pnpm run version:sync`**(**`pnpm run build`** 開始時にも実行)で、**`pyproject.toml`**、**`meshchatx/src/version.py`**、**`THIRD_PARTY_NOTICES.txt`**(製品行)、**README** / **lang/README.\***(現在のバージョン行)、**`docs/meshchatx_on_raspberry_pi.md`** の pipx 例、**`packaging/arch/PKGBUILD`** の補助フィールドに反映します。
diff --git a/lang/README.ru.md b/lang/README.ru.md
index 50dbd7ab..4f0bbcfd 100644
--- a/lang/README.ru.md
+++ b/lang/README.ru.md
@@ -348,7 +348,7 @@ task build
## Версионирование
-Текущая версия в репозитории: `4.7.2`.
+Текущая версия в репозитории: `4.8.0`.
- Редактируйте для релизного бампа **только** поле `version` в **`package.json`**.
- Команда **`pnpm run version:sync`** (также в начале **`pnpm run build`**) распространяет эту версию в **`pyproject.toml`**, **`meshchatx/src/version.py`**, **`THIRD_PARTY_NOTICES.txt`** (строка продукта), **README** / **lang/README.\*** (строки «текущая версия»), **`docs/meshchatx_on_raspberry_pi.md`** (пример pipx) и вспомогательные поля **`packaging/arch/PKGBUILD`**.
diff --git a/lang/README.zh.md b/lang/README.zh.md
index 0fa7a755..4e3e6ec8 100644
--- a/lang/README.zh.md
+++ b/lang/README.zh.md
@@ -348,7 +348,7 @@ task build
## 版本管理
-本仓库当前版本: `4.7.2`。
+本仓库当前版本: `4.8.0`。
- 发布版本号**只**改 **`package.json` 的 `version`**。
- 运行 **`pnpm run version:sync`**(在 **`pnpm run build`** 开头也会执行)可将该版本同步到 **`pyproject.toml`**、**`meshchatx/src/version.py`**、**`THIRD_PARTY_NOTICES.txt`**(产品行)、**README** / **lang/README.\*** 中的“当前版本”行、**`docs/meshchatx_on_raspberry_pi.md`** 的 pipx 示例,以及 **`packaging/arch/PKGBUILD`** 的辅助字段。
diff --git a/meshchatx/__init__.py b/meshchatx/__init__.py
index 7d7d9bf9..1224aa66 100644
--- a/meshchatx/__init__.py
+++ b/meshchatx/__init__.py
@@ -3,4 +3,4 @@
"""Reticulum MeshChatX - A mesh network communications app."""
# Synced from package.json via scripts/sync_version.js (also writes meshchatx/src/version.py).
-__version__ = "4.7.2"
+__version__ = "4.8.0"
\ No newline at end of file
diff --git a/meshchatx/src/backend/data/THIRD_PARTY_NOTICES.txt b/meshchatx/src/backend/data/THIRD_PARTY_NOTICES.txt
index c3e8289d..2c126df0 100644
--- a/meshchatx/src/backend/data/THIRD_PARTY_NOTICES.txt
+++ b/meshchatx/src/backend/data/THIRD_PARTY_NOTICES.txt
@@ -76,7 +76,7 @@ pycparser 3.0
pyserial 3.5
License: BSD
Author: Chris Liechti
-reticulum-meshchatx 4.7.2
+reticulum-meshchatx 4.8.0
License: 0BSD AND MIT
Author: Quad4
rns 1.3.7
diff --git a/meshchatx/src/backend/data/licenses_backend.json b/meshchatx/src/backend/data/licenses_backend.json
index b372d2a3..85b720b2 100644
--- a/meshchatx/src/backend/data/licenses_backend.json
+++ b/meshchatx/src/backend/data/licenses_backend.json
@@ -145,7 +145,7 @@
},
{
"name": "reticulum-meshchatx",
- "version": "4.7.2",
+ "version": "4.8.0",
"author": "Quad4",
"license": "0BSD AND MIT"
},
diff --git a/meshchatx/src/frontend/public/meshchatx-docs/meshchatx_on_raspberry_pi.md b/meshchatx/src/frontend/public/meshchatx-docs/meshchatx_on_raspberry_pi.md
index 9ad02b1d..bd118a4c 100644
--- a/meshchatx/src/frontend/public/meshchatx-docs/meshchatx_on_raspberry_pi.md
+++ b/meshchatx/src/frontend/public/meshchatx-docs/meshchatx_on_raspberry_pi.md
@@ -61,17 +61,17 @@ source ~/.profile
## 3) Install MeshChatX with pipx (recommended)
-Preferred option (recommended): install from a release wheel (4.7.2 or newer),
+Preferred option (recommended): install from a release wheel (4.8.0 or newer),
because the wheel bundles frontend assets.
```bash
pipx install /path/to/reticulum_meshchatx-<version>-py3-none-any.whl
```
-Direct example (v4.7.2):
+Direct example (v4.8.0):
```bash
-pipx install "https://github.com/Quad4-Software/MeshChatX/releases/download/v4.7.2/reticulum_meshchatx-4.7.2-py3-none-any.whl"
+pipx install "https://github.com/Quad4-Software/MeshChatX/releases/download/v4.8.0/reticulum_meshchatx-4.8.0-py3-none-any.whl"
```
`py3-none-any` wheels are architecture-independent, so the same wheel artifact
@@ -93,7 +93,7 @@ cd ~/meshchatx
python3 -m venv .venv
source .venv/bin/activate
python -m pip install --upgrade pip
-python -m pip install "https://github.com/Quad4-Software/MeshChatX/releases/download/v4.7.2/reticulum_meshchatx-4.7.2-py3-none-any.whl"
+python -m pip install "https://github.com/Quad4-Software/MeshChatX/releases/download/v4.8.0/reticulum_meshchatx-4.8.0-py3-none-any.whl"
```
Run command in venv mode:
diff --git a/meshchatx/src/version.py b/meshchatx/src/version.py
index d74f1c96..86c13caa 100644
--- a/meshchatx/src/version.py
+++ b/meshchatx/src/version.py
@@ -3,4 +3,4 @@
Do not edit by hand. Run: pnpm run version:sync
"""
-__version__ = "4.7.2"
+__version__ = "4.8.0"
diff --git a/package.json b/package.json
index 4dafb4c5..d22dba06 100644
--- a/package.json
+++ b/package.json
@@ -1,6 +1,6 @@
{
"name": "reticulum-meshchatx",
- "version": "4.7.2",
+ "version": "4.8.0",
"description": "A simple mesh network communications app powered by the Reticulum Network Stack",
"homepage": "https://github.com/Quad4-Software/MeshChatX",
"desktopName": "reticulum-meshchatx.desktop",
diff --git a/packaging/arch/.SRCINFO b/packaging/arch/.SRCINFO
index 8fe3c0af..9fbfe679 100644
--- a/packaging/arch/.SRCINFO
+++ b/packaging/arch/.SRCINFO
@@ -1,6 +1,6 @@
pkgbase = reticulum-meshchatx-git
pkgdesc = A simple mesh network communications app powered by the Reticulum Network Stack
- pkgver = 4.7.2.r0.gebacc00
+ pkgver = 4.8.0.r0.gebacc00
pkgrel = 1
url = https://github.com/Quad4-Software/MeshChatX
arch = x86_64
diff --git a/packaging/arch/PKGBUILD b/packaging/arch/PKGBUILD
index 38d9836c..516d14ea 100644
--- a/packaging/arch/PKGBUILD
+++ b/packaging/arch/PKGBUILD
@@ -1,7 +1,7 @@
# Maintainer: Ivan <ivan@quad4.io>
pkgname=reticulum-meshchatx-git
_pkgname=reticulum-meshchatx
-pkgver=4.7.2.r0.gebacc00
+pkgver=4.8.0.r0.gebacc00
pkgrel=1
pkgdesc="A simple mesh network communications app powered by the Reticulum Network Stack"
arch=('x86_64' 'aarch64')
@@ -19,7 +19,7 @@ sha256sums=('SKIP'
pkgver() {
cd "$_pkgname"
git describe --long --tags 2>/dev/null | sed 's/^v//;s/\([^-]*-g\)/r\1/;s/-/./g' || \
- printf "4.7.2.r%s.%s" "$(git rev-list --count HEAD)" "$(git rev-parse --short HEAD)"
+ printf "4.8.0.r%s.%s" "$(git rev-list --count HEAD)" "$(git rev-parse --short HEAD)"
}
prepare() {
diff --git a/pyproject.toml b/pyproject.toml
index 9e7e020c..b80da60c 100644
--- a/pyproject.toml
+++ b/pyproject.toml
@@ -1,6 +1,6 @@
[project]
name = "reticulum-meshchatx"
-version = "4.7.2"
+version = "4.8.0"
description = "A simple mesh network communications app powered by the Reticulum Network Stack"
authors = [
{name = "Quad4"}
diff --git a/scripts/sync_version.js b/scripts/sync_version.js
index a04ccb39..e7749a3e 100644
--- a/scripts/sync_version.js
+++ b/scripts/sync_version.js
@@ -5,6 +5,8 @@
* Writes: meshchatx/__init__.py (__version__), meshchatx/src/version.py, pyproject.toml [project].version,
* meshchatx/src/backend/data/THIRD_PARTY_NOTICES.txt (reticulum-meshchatx line only),
* README + lang README "current version" lines, docs/meshchatx_on_raspberry_pi.md,
+ * meshchatx/src/frontend/public/meshchatx-docs/meshchatx_on_raspberry_pi.md,
+ * meshchatx/src/backend/data/licenses_backend.json (reticulum-meshchatx entry),
* android/app/build.gradle,
* pipx example, packaging/arch/PKGBUILD pkgver / printf fallback.
*
@@ -99,6 +101,18 @@ function patchRaspberryPiDoc(c) {
}
patchFile("docs/meshchatx_on_raspberry_pi.md", patchRaspberryPiDoc);
+patchFile("meshchatx/src/frontend/public/meshchatx-docs/meshchatx_on_raspberry_pi.md", patchRaspberryPiDoc);
+
+const licensesBackendPath = path.join(root, "meshchatx", "src", "backend", "data", "licenses_backend.json");
+if (fs.existsSync(licensesBackendPath)) {
+ const licensesBackend = JSON.parse(fs.readFileSync(licensesBackendPath, "utf8"));
+ const meshchatEntry = licensesBackend.find((entry) => entry.name === "reticulum-meshchatx");
+ if (meshchatEntry && meshchatEntry.version !== version) {
+ meshchatEntry.version = version;
+ fs.writeFileSync(licensesBackendPath, `${JSON.stringify(licensesBackend, null, 4)}\n`, "utf8");
+ console.log(`Updated ${path.relative(root, licensesBackendPath)}`);
+ }
+}
const versionParts = version.split(".").map((n) => Number.parseInt(n, 10));
if (versionParts.length === 3 && versionParts.every((n) => Number.isFinite(n))) {
@@ -116,4 +130,8 @@ patchFile("packaging/arch/PKGBUILD", (c) => {
return x;
});
+patchFile("packaging/arch/.SRCINFO", (c) =>
+ c.replace(/^(\tpkgver = )\d+\.\d+\.\d+(\.r\d+\.g[0-9a-f]+)$/m, `$1${version}$2`)
+);
+
console.log(`Synced version ${version} from package.json`);
diff --git a/uv.lock b/uv.lock
index d7711960..0daf0ba0 100644
--- a/uv.lock
+++ b/uv.lock
@@ -1766,7 +1766,7 @@ wheels = [
[[package]]
name = "reticulum-meshchatx"
-version = "4.7.2"
+version = "4.8.0"
source = { editable = "." }
dependencies = [
{ name = "aiohttp" },
──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────